// utils/wechat-business.js

class WechatBusiness {
  /**
   * 检查是否支持 openBusinessView
   */
  static isSupportOpenBusinessView() {
    if (typeof window.wx === 'undefined') {
      console.warn('wx 对象未定义')
      return false
    }
    
    // 在开发者工具中，可能 wx 对象存在但没有 openBusinessView 方法
    if (typeof window.wx.openBusinessView !== 'function') {
      console.warn('wx.openBusinessView 方法不存在')
      return false
    }
    
    return true
  }

  /**
   * 检查 wx 对象是否就绪
   */
  static isWxReady() {
    if (typeof window.wx === 'undefined') {
      return false
    }
    
    // 检查必要的核心方法是否存在
    const requiredMethods = ['ready', 'config', 'error']
    for (const method of requiredMethods) {
      if (typeof window.wx[method] !== 'function') {
        console.warn(`wx.${method} 方法不存在`)
        return false
      }
    }
    
    return true
  }

  /**
   * 等待 wx 对象就绪
   */
  static waitForWxReady(timeout = 5000) {
    return new Promise((resolve, reject) => {
		console.log(resolve)
		console.log(reject)
      // 如果已经就绪，直接返回
      if (this.isWxReady()) {
        resolve()
        return
      }

      console.log('等待 wx 对象就绪...')
      
      // 轮询检查
      const startTime = Date.now()
      const checkInterval = setInterval(() => {
        if (this.isWxReady()) {
          clearInterval(checkInterval)
          console.log('wx 对象已就绪')
          resolve()
          return
        }
        
        // 超时检查
        if (Date.now() - startTime > timeout) {
          clearInterval(checkInterval)
          reject(new Error('等待 wx 对象就绪超时'))
        }
      }, 100)
    })
  }

  /**
   * 打开会员卡开卡组件
   */
  static async openMemberCard(config) {
    try {
      console.log('=== 开始打开开卡组件 ===')
      
      // 1. 检查基础环境
      if (typeof window.wx === 'undefined') {
        throw new Error('微信 SDK 未加载，请检查是否引入了 jweixin-1.5.0.js')
      }

      // 2. 等待 wx 对象就绪
      await this.waitForWxReady()
      
      // 3. 检查微信版本
      const versionCheck = this.checkWechatVersion()
      if (!versionCheck.supported) {
        throw new Error(versionCheck.message)
      }

      // 4. 构建 queryString
      const queryString = this.buildQueryString(config)
      
      console.log('打开会员卡开卡组件，参数:', config)
      console.log('queryString:', queryString)

      // 5. 在开发者工具中模拟调用
      if (this.isDevTools()) {
        console.log('🧪 开发者工具中模拟调用 openBusinessView')
        return await this.simulateOpenMemberCard(config)
      }

      // 6. 检查 openBusinessView 方法是否存在
      if (typeof window.wx.openBusinessView !== 'function') {
        console.warn('wx.openBusinessView 方法不存在，使用模拟模式')
        return await this.simulateOpenMemberCard(config)
      }

      // 7. 正式调用
      return await this.callOpenBusinessView(queryString)

    } catch (error) {
      console.error('打开开卡组件失败:', error)
      throw error
    }
  }

  /**
   * 调用 openBusinessView 方法
   */
  static callOpenBusinessView(queryString) {
    return new Promise((resolve, reject) => {
      console.log('正式调用 wx.openBusinessView...')
      
      window.wx.ready(() => {
        console.log('wx.ready 回调执行')
        
        window.wx.openBusinessView({
          businessType: 'wxpaymktMemberOpen',
          queryString: queryString,
          success: (res) => {
            console.log('打开会员卡开卡组件成功:', res)
            resolve(res)
          },
          fail: (err) => {
            console.error('打开会员卡开卡组件失败:', err)
            reject(new Error(this.getErrorMessage(err)))
          }
        })
      })

      // 添加错误处理
      window.wx.error((err) => {
        console.error('wx.config 错误:', err)
        reject(new Error(`微信 SDK 配置错误: ${JSON.stringify(err)}`))
      })
    })
  }

  /**
   * 检查是否在开发者工具中
   */
  static isDevTools() {
    const ua = navigator.userAgent.toLowerCase()
    return ua.includes('wechatdevtools') || ua.includes('wechat_devtools')
  }

  /**
   * 检查微信版本是否支持
   */
  static checkWechatVersion() {
    const ua = navigator.userAgent.toLowerCase()
    const wechatMatch = ua.match(/micromessenger\/([\d.]+)/i)
    
    if (!wechatMatch) {
      return {
        supported: this.isDevTools(), // 开发者工具中默认支持
        version: 'unknown',
        message: '非微信环境'
      }
    }
    
    const version = wechatMatch[1]
    const versionNum = parseFloat(version)
    const minVersion = 7.0
    
    return {
      supported: versionNum >= minVersion || this.isDevTools(),
      version: version,
      message: versionNum >= minVersion ? '版本支持' : `微信版本过低，当前${version}，需要7.0.5+`
    }
  }

  /**
   * 构建 queryString 参数
   */
  static buildQueryString(config) {
    const params = {
      // 必填参数
      card_id: config.cardId,
      out_str: config.outStr || `dev_${Date.now()}`,
      
      // 可选参数
      app_id: config.appId || 'wx1234567890abcdef',
      openid: config.openid || 'o6_bmjrPTlm6_2sgVt7hMZOPfL2M',
      timestamp: config.timestamp || Math.floor(Date.now() / 1000),
      nonce_str: config.nonceStr || this.generateNonceStr(),
      sign_type: config.signType || 'SHA1',
      signature: config.signature || 'dev_signature_' + Date.now()
    }

    // 过滤空值并编码
    const queryString = Object.keys(params)
      .filter(key => params[key] !== null && params[key] !== undefined && params[key] !== '')
      .map(key => `${key}=${encodeURIComponent(params[key])}`)
      .join('&')

    return queryString
  }

  /**
   * 生成随机字符串
   */
  static generateNonceStr(length = 16) {
    const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
    let result = ''
    for (let i = 0; i < length; i++) {
      result += chars.charAt(Math.floor(Math.random() * chars.length))
    }
    return result
  }

  /**
   * 获取错误信息
   */
  static getErrorMessage(err) {
    if (!err) return '未知错误'
    
    const errorMap = {
      'config invalid': '配置无效',
      'invalid query': '查询参数无效',
      'invalid businessType': '业务类型无效',
      'user cancel': '用户取消',
      'network error': '网络错误',
      'system error': '系统错误',
      'function not exist': '功能不支持'
    }
    
    return errorMap[err.errMsg] || err.errMsg || '未知错误'
  }

  /**
   * 模拟开卡成功（开发者工具专用）
   */
  static simulateOpenMemberCard(config) {
    return new Promise((resolve) => {
      console.log('🧪 开发者工具模拟开卡:', config)
      
      // 模拟网络延迟
      setTimeout(() => {
        resolve({
          errMsg: 'openBusinessView:ok',
          result: 'simulate_success',
          cardId: config.cardId,
          openid: config.openid || 'simulated_openid',
          timestamp: Date.now(),
          isSimulated: true
        })
      }, 1500)
    })
  }

  /**
   * 检查环境支持情况（详细版）
   */
  static checkEnvironment() {
    const versionCheck = this.checkWechatVersion()
    const ua = navigator.userAgent.toLowerCase()
    const isDevTools = this.isDevTools()
    
    return {
      // 环境信息
      isWechat: /micromessenger/i.test(ua),
      isDevTools: isDevTools,
      userAgent: ua,
      
      // SDK 状态
      isWxDefined: typeof window.wx !== 'undefined',
      isWxReady: this.isWxReady(),
      supportOpenBusinessView: this.isSupportOpenBusinessView(),
      
      // 版本信息
      version: versionCheck.version,
      versionSupported: versionCheck.supported,
      versionMessage: versionCheck.message,
      
      // 方法检查
      wxMethods: this.checkWxMethods()
    }
  }

  /**
   * 检查 wx 对象的方法
   */
  static checkWxMethods() {
    if (typeof window.wx === 'undefined') {
      return { error: 'wx 对象未定义' }
    }
    
    const methods = ['ready', 'config', 'error', 'openBusinessView']
    const result = {}
    
    methods.forEach(method => {
      result[method] = typeof window.wx[method]
    })
    
    return result
  }

  /**
   * 初始化微信 SDK（如果尚未初始化）
   */
  static async ensureWxInitialized() {
    if (this.isWxReady()) {
      console.log('wx 对象已就绪')
      return true
    }
    
    console.log('wx 对象未就绪，尝试初始化...')
    
    // 这里可以调用你的 WechatSDK.init() 方法
    // 或者直接加载微信 JS-SDK
    await this.loadWxSDK()
    
    return this.waitForWxReady()
  }

  /**
   * 加载微信 JS-SDK
   */
  static loadWxSDK() {
    return new Promise((resolve, reject) => {
      // 如果已经加载，直接返回
      if (typeof window.wx !== 'undefined') {
        resolve()
        return
      }

      console.log('开始加载微信 JS-SDK...')
      
      const script = document.createElement('script')
      script.src = 'https://res.wx.qq.com/open/js/jweixin-1.6.0.js'
      
      script.onload = () => {
        console.log('微信 JS-SDK 加载完成')
        // 给点时间初始化
        setTimeout(() => {
          if (typeof window.wx === 'undefined') {
            reject(new Error('微信 JS-SDK 加载后 wx 对象仍未定义'))
          } else {
            resolve()
          }
        }, 100)
      }
      
      script.onerror = () => {
        reject(new Error('微信 JS-SDK 加载失败'))
      }
      
      document.head.appendChild(script)
    })
  }
}

export default WechatBusiness